<!-- 
  一、patch (oldVnode, vnode)
    patch函数接收两个参数 oldVnode 和 Vnode ,分别代表新节点和之前的旧节点。
      如果两个节点都是一样的，那么就执行 patchVnode 深入检查他们的子节点；
      如果两个节点不一样那就说明 Vnode 完全被改变了，就可以直接替换 oldVnode。
  二、patchVnode(oldVnode, vnode)([src/core/vdom/patch.js]
    更新真实 dom 节点的 data 属性，相当于对 dom节点进行了预处理的操作
    这其中的 diff 过程中又分了好几种情况
      1) 首先进行文本节点的判断，若新老dom节点文本不同，那么就会直接进行文本节点的替换；
      2) 在新dom节点情况下，进入子节点的 diff ；
      3) 当老子节点和新子节点都存在且不相同的情况下，调用 updateChildren 对子节点进行 diff ；
      4) 若老子节点不存在，新子节点存在，先清空老节点的文本节点，同时调用 addVnodes 方法将新子节点添加到 elm 真实 dom 节点当中；
      5) 若老子节点存在，新子节点不存在，则删除 elm 真实节点下的老子节点；
      6) 若老节点有文本节点，而新节点没有，就清空这个文本节点。
  三、updateChildren （parentElm, oldCh, newCh）-----  是最重要的环节:
    会将新老DOM节点提取出来首先给老子节点和新子节点分别分配一个 startIndex 和 endIndex 来作为遍历的索引，当老子节点或者新子节点遍历完后(遍历完的条件就是老子节点或者新子节点的 startIndex >= endIndex )，就停止 老子节点 和新子节点的 diff 过程。
    接下来通过实例来看下整个 diff 的过程(节点属性中不带 key 的情况):
      1) 首先从第一个节点开始比较，不管是老子节点还是新子节点的起始或者终止节点都不存在sameVnode ，同时节点属性中是不带 key 标记的，因此第一轮的 diff 完后，新子节点的startVnode 被添加到 oldStartVnode 的前面，同时新节点起始索引+1；
      2) 第二轮的 diff 中，满足 sameVnode(oldStartVnode, newStartVnode) ，因此对这两个 vnode 进行 diff ，最后将 patch 标记的差异反应到当前比较的老节点上,同时 oldStartVnode 和 newStartIndex +1位。
      3) 第三轮的 diff 中，满足 sameVnode(最后位置老节点, 当前比较位置新节点) ，那么首先对 oldEndVnode 和 newStartVnode 进行 diff ，并对 oldEndVnode 进行 patch ，并完成 oldEndVnode 移位的操作，最后 newStartIndex +1， oldStartVnode 后移一位；
      4) 遍历的过程结束后， newStartIndex > newEndIndex ，说明此时老子节点存在多余的节点，那么最后就需要将这些多余的节点删除。
    在 vnode 不带 key 的情况下，每一轮的 diff 过程当中都是 起始 和 结束 节点进行比较，直到 oldCh或者 newCh 被遍历完。而当为 vnode 引入 key 属性后，在每一轮的 diff 过程中，当 起始 和 结束 节点都没有找到 sameVnode 时，首先对 oldCh 中进行 key 值与索引的映射。
  四、createKeyToOldIdx 方法 key
    用以将老子节点作为 键 ，而对应的节点的索引作为 值 。然后再判断在 newStartVnode 的属性中是否有 key ，且是否在 oldKeyToIndx 中找到对应的节点。
      1) 如果不存在这个 key ，那么就将这个 newStartVnode 作为新的节点创建且插入到原有的 root 的子节点前面:
      2) 如果存在这个 key ， 将找到的key一致的oldVnode再和newStartVnode，然后再进行 diff 的过程:
    通过以上分析，给 vdom 上添加 key 属性后，遍历 diff 的过程中，当 起始点 , 结束点 的 搜寻 及diff 出现还是无法匹配的情况下时，就会用 key 来作为唯一标识，来进行 diff ，这样就可以提高 diff 效率。
    注意在第一轮的 diff 过后 oldCh 上的 B节点 被删除了，但是 newCh 上的 B节点 上 elm 属性保持对oldCh 上 B节点 的 elm 引用。



 -->